
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<template>
<button @click="toggleSlide" class="toggle">{{ slideText }}</button>
<div class="grid2_8">
<div :class="['slide-content left', { active: showSlide }]">
<div class="wrap flex-between">
<div class="search">
<div class="search-mobile">
<h2>조건검색</h2>
<div class="box grid gap05 bg-gray">
<div class="titleBar">
<h3>지역설정</h3>
<hr />
</div>
<DongSelectList @setDongCd="setDongCd" :crslk_azHiddenCk="true" :open_layers="this.$refs.open_layers"
@siDoGunGuSelectF="dongSelectF" @dongSelectF="dongSelectF" @nodeSelectF="dongSelectF" ref="dongSelecter">
</DongSelectList>
</div>
<div class="box">
<div class="titleBar">
<h3>조건 설정</h3>
<hr />
</div>
<div class="flex-between m-b">
<input class="m-r cbox_1" type="checkbox" v-model="condition['wtrms']" /><label for="">무단횡단</label>
<input class="m-r cbox_1" type="checkbox" v-model="condition['signExtn']" /><label for="">신호연장</label>
<input class="m-r cbox_1" type="checkbox" v-model="condition['rittrnVhcle']" /><label for="">신호위반</label>
<input class="m-r cbox_1" type="checkbox" v-model="condition['eqpmnTrobl']" /><label for="">장애발생</label>
</div>
<!--
<div class="grid3_7 m-b">
<label for="date-input">일자</label>
<input class="date-input" id="date-input" type="date" v-model="condition['date']" />
</div>
<div class="grid3_7 m-b3">
<label for="time-input">시간대</label>
<div class="flex-between gap">
<input
class="time-input"
id="time-input"
type="time"
v-model="condition['start_time']"
/>~<input
class="time-input"
id="time-input"
type="time"
v-model="condition['end_time']"
/>
</div>
</div> -->
<button class="btn-l gr-btn search-btn" @click="statusSearch()" style="padding: 0.5rem 0">
검색하기
</button>
</div>
</div>
<div class="live-mobile">
<h2>실시간 발생 현황</h2>
<div class="box bg-white tab-buttons" style="height: calc(100% - 50rem)">
<div class="btn_set flex-center gap">
<button class="m-r flex-between gray-btn" v-for="tab in tabs" :key="tab.id"
:class="{ active: activeTab === tab.id }" @click="changeTab(tab.id)">
{{ tab.title }}
<img v-if="tab.id === 2 && troubleOccurrenceStatusList.length > 0"
src="../../../resources/images/warning.png" alt="" />
</button>
</div>
<div class="ulbox">
<div class="tab-content" v-for="tab in tabs" :key="tab.id" v-show="activeTab === tab.id">
<ul v-show="tab.content1">
<li v-for="(item, idx) in situationOccurrenceStatusList" :key="idx">
<p class="" style="color: #9bbb8d; ">상황명: {{ item.sn }}</p>
<p class="" style="color: #474747; font-size: 14px;"><img
src="../../../resources/images/icon/map.png" alt=""> {{ item.node_name }} {{ item.crslk_az }}쪽횡단보도
</p>
<p class="m-b" style="color: #767677; font-size: 13px;">발생일시: {{ item.ocrn_dt }}</p>
</li>
</ul>
<ul v-show="tab.content2">
<li v-for="(item, idx) in troubleOccurrenceStatusList" :key=idx @click="troblCcrnLocation(item)">
<p class="m-b" style="color: #9bbb8d; ">장애명: {{ item.trobl_nm }}</p>
<p class="m-b" style="color: #474747; font-size: 14px;"><img
src="../../../resources/images/icon/map.png" alt=""> {{ item.node_name }} {{ item.crslk_az
}}쪽횡단보도 </p>
<p class="m-b">발생일시: {{ item.ocrn_dt }}</p>
<p class="m-b">담당자: {{ item.mngr_nm }}</p>
<p class="m-b">연락처: {{ item.mngr_telno }}</p>
<p class="">복구여부: {{ item.recovery_yn }}</p>
</li>
</ul>
</div>
</div>
<div v-for="tab in tabs" :key="tab.id" v-show="activeTab === tab.id">
<PaginationButton v-show="tab.content1" v-if="situationOccurrenceStatusListCount > 0"
v-model:currentPage="situationOccurrenceStatusListSearch.currentPage"
:per-page="situationOccurrenceStatusListSearch.perPage"
:total-count="situationOccurrenceStatusListCount" :max-range="5"
:click="situationOccurrenceStatusSearch" />
<PaginationButton v-show="tab.content2" v-if="troubleOccurrenceStatusListCount > 0"
v-model:currentPage="troubleOccurrenceStatusListSearch.currentPage"
:per-page="troubleOccurrenceStatusListSearch.perPage" :total-count="troubleOccurrenceStatusListCount"
:max-range="5" :click="troubleOccurrenceStatusSearch" />
</div>
</div>
</div>
</div>
</div>
</div>
<div class="right">
<div class="top">
<ul class="flex-end">
<li>
<p class="flex-center gap">
<img class="m-r" src="../../../resources/images/icon/scumulativenumberofpedestrians.png" alt />금일 보행자
</p>
<h3>
<em class="green2 m-r">{{ comma(statusControlCountList.pdstrnCount) }}</em>명
</h3>
</li>
<li class="br"></li>
<li>
<p class="flex-center gap">
<img class="m-r" src="../../../resources/images/icon/scumulativenumberofpedestrians.png" alt />금일 무단횡단 발생
</p>
<h3>
<em class="green2 m-r">{{ comma(statusControlCountList.wtrmsCount) }}</em>회
</h3>
</li>
<li class="br"></li>
<li>
<p class="flex-center gap">
<img class="m-r" src="../../../resources/images/icon/Numberofsignalextensionstoday.png" alt />금일 신호연장 발생
</p>
<h3>
<em class="green2 m-r">{{ comma(statusControlCountList.signExtnCount) }}</em>회
</h3>
</li>
<li class="br"></li>
<li>
<p class="flex-center gap">
<img class="m-r" src="../../../resources/images/icon/Numberofsignalextensionstoday.png" alt />금일 신호연장 시간
</p>
<h3>
<em class="green2 m-r">{{ comma(statusControlCountList.signExtnTime) }}</em>초
</h3>
</li>
<li class="br"></li>
<li>
<p class="flex-center gap">
<img class="m-r" src="../../../resources/images/icon/Numberofsignalviolationstoday.png" alt />금일 차량 신호위반 발생
</p>
<h3>
<em class="green2 m-r">{{ comma(statusControlCountList.rittrnVioltVhcleCount) }}</em>회
</h3>
</li>
<li class="br"></li>
<li>
<p class="flex-center gap">
<img class="m-r" src="../../../resources/images/icon/Numberofsignalviolationstoday.png" alt />금일 장애 발생
</p>
<h3>
<em class="green2 m-r">{{ comma(statusControlCountList.troblOcrnCount) }}</em>회
</h3>
</li>
</ul>
</div>
<OpenLayers ref="open_layers" />
<!-- Popup container -->
<div v-if="isPopupVisible" class="popup-container">
<!-- Popup content -->
<div class="popup-content">
<!-- Add your popup content here -->
<h2>{{ popupStatus.type }} 발생</h2>
<ul>
<li>
<p class="m-b">발생일시: {{ popupStatus.ocrn_dt }}</p>
<p class="">발생장소: {{ popupStatus.crslk_nm }} 횡단보도</p>
</li>
</ul>
<button @click="hidePopup(popupStatus.node_id)" class="s-btn gr-btn">확인</button>
</div>
</div>
</div>
<div class="chart grid gap">
<div class="bg-white2 b-r b-shadow">
<h2 style="font-size: 1.3rem">
금일 횡단보도 별 무단횡단 발생 건수 (상위10개소)
</h2>
<div class="box">
<div style="width: 100%; height: 100%" id="chartdivWrap1">
<div ref="chartdiv1" id="chartdiv1" style="width: 100%; height: 90%"></div>
</div>
</div>
</div>
<div class="bg-white2 b-r b-shadow">
<h2 style="font-size: 1.3rem">
금일 횡단보도 별 신호연장 발생 건수 (상위10개소)
</h2>
<div class="box">
<div style="width: 100%; height: 100%" id="chartdivWrap2">
<div ref="chartdiv2" id="chartdiv2" style="width: 100%; height: 90%"></div>
</div>
</div>
</div>
<div class="bg-white2 b-r b-shadow">
<h2 style="font-size: 1.3rem">
금일 횡단보도 별 우회전 위반 발생 건수 (상위5개소)
</h2>
<div class="box">
<div style="width: 100%; height: 100%" id="chartdivWrap3">
<div ref="chartdiv3" id="chartdiv3" style="width: 100%; height: 90%"></div>
</div>
</div>
</div>
<div class="bg-white2 b-r b-shadow">
<h2 style="font-size: 1.3rem">
금일 횡단보도 별 장비장애 발생 건수 (상위5개소)
</h2>
<div class="box">
<div style="width: 100%; height: 100%" id="chartdivWrap4">
<div ref="chartdiv4" id="chartdiv4" style="width: 100%; height: 90%"></div>
</div>
</div>
</div>
</div>
<!-- 팝업 -->
<div class="modal-wrap" v-if="modal_event_detail_list == true">
<div class="modal-bg"></div>
<div class="modal_base">
<h2>
<span>{{ eventListSearch.eventType }} 발생 정보</span>
<button type="button" class="gray-btn modal_base_close" @click="modal_event_detail_list = false">
<img src="../../../resources/images/close.png" alt="" />
</button>
</h2>
<div class="modal_base_body">
<div class="de_Search">
<!--<table class="troubleTable">
<tbody>
<tr>
<th>검색</th>
<td colspan="7" >
<select name="" id="">
<option value="">검색조건</option>
<option value="">이름</option>
<option value="">소속정보</option>
</select>
<input type="text" placeholder="검색어를 입력 해주세요." style="width: 76%;" />
<button type="button" class="green-btn" style="margin-left: 5px;padding: 5px;width: 10rem; float: right;" >검색</button>
</td>
</tr>
</tbody>
</table>-->
</div>
<table>
<thead>
<tr>
<td>동이름</td>
<td>횡단보도명</td>
<td>상황명</td>
<td>발생시간</td>
</tr>
</thead>
<tbody>
<tr v-for="(item, idx) in eventList" :key="idx">
<td data-title="교차로명">{{ item.dong_nm }}</td>
<td data-title="횡단보도명"> {{ item.crslk_nm }} 쪽횡단보도</td>
<td data-title="상황명">{{ item.type }}</td>
<td data-title="발생시간">{{ item.ocrn_dt }}</td>
</tr>
<tr>
<td class="exception" colspan="4" v-if="eventList.length < 1">조회된 데이터가 없습니다</td>
</tr>
</tbody>
</table>
<PaginationButton v-model:currentPage="eventListSearch.currentPage" :per-page="eventListSearch.perPage"
:total-count="eventListCount" :max-range="5" :click="eventSelectList" />
</div>
<div class="modal_base_bottom gap">
<button type="button" class="btn-2 gray-btn wrem_10 mrg_5p" @click="modal_event_detail_list = false">닫기</button>
</div>
</div>
</div>
</div>
</template>
<script>
import OpenLayers from "../../component/OpenLayers_dev.vue";
import {
vworldBaseLayer,
vworldGrayLayer,
vworldMidnightLayer,
vworldHybridLayer,
vworldSatelliteLayer,
} from "../../component/OpenLayersMap.vue";
import COMMON_CHART from "../../common/common.js";
import Overlay from "ol/Overlay"
import { baseStyles } from "../../component/OpenLayersStyle.vue";
import axios from "axios";
import DongSelectList from "../../component/dongSelectList.vue";
import PaginationButton from "../../component/pagination/PaginationButton.vue";
import COMMON_UTIL from '../../../resources/js/commonUtil.ts';
export default {
data() {
return {
address: {
},
troubleOccurrenceStatusListSearch: {
currentPage: 1,
perPage: 10,
orderByType: 'DESC',
},
situationOccurrenceStatusListSearch: {
currentPage: 1,
perPage: 10,
orderByType: 'DESC',
},
eventListSearch: {
currentPage: 1,
perPage: 10,
startDate: null,
endDate: null,
eventType: null,
sigungu_cd: null,
dong_cd: null,
dong_dong_cd: null,
node_id: null,
crslk_az: null
},
situationOccurrenceStatusList: [],
situationOccurrenceStatusListCount: 0,
troubleOccurrenceStatusList: [],
troubleOccurrenceStatusListCount: 0,
eventListCount: 0,
eventList: [],
eventIdx: 0,
isPopupVisible: false,
showSlide: false,
slideText: "검색하기",
address: {},
//조건설정
condition: {
//체크박스
signExtn: true,
wtrms: true,
rittrnVhcle: true,
eqpmnTrobl: true,
//일자
date: null,
start_date: null,
end_date: null,
//시간대
start_time: null,
end_time: null,
// 신규데이터 비교 시간대
currentTimestamp: null,
popuptitle: "무단횡단 발생목록"
},
ck: true,
tabs: [
{
id: 1,
title: "상황발생현황",
content1: "This is the content for Tab 1",
},
{
id: 2,
title: "장애발생현황",
content2: "This is the content for Tab 2",
},
],
activeTab: 1,
activeTab2: 1,
chart1: {},
chart2: {},
chart3: {},
chart4: {},
chartData: {
wtrms: [],
signExtn: [],
rittrnVioltVhcle: [],
troblOcrn: [],
},
data1: [],
statusControlCountList: {
pdstrnCount: 0,
wtrmsCount: 0,
signExtnCount: 0,
signExtnTime: 0,
rittrnVioltVhcleCount: 0,
troblOcrnCount: 0,
},
// 실시간 발생 이벤트
popupStatus: {
node_id: '',
crslk_az: '',
ocrn_dt: '',
type: ''
},
// 실시간 발생 이벤트 리스트
realTimeEventList: [],
// 이벤트 발생 체크
eventFlage: false,
// 이벤트 상세보기 팝업
modal_event_detail_list: false,
// 타이머 관리
timer: {}
};
},
components: {
PaginationButton: PaginationButton,
OpenLayers: OpenLayers,
DongSelectList: DongSelectList,
},
methods: {
// 휠 이벤트
childWheel(coordinate) {
},
//DongSelectList에서 dong_cd 받아오기
setDongCd(value) {
this.address = value;
},
childMoveEnd(zoom) {
// console.log("zoom zoomzoom: ", zoom);
if (this.now_zoom >= 18.6 && zoom < 18.6) {
this.address.node_id = null;
this.statusSearch(false);
}
this.now_zoom = zoom;
},
// 실시간 발생 토클?
toggleSlide() {
if (this.showSlide) {
this.slideText = "검색하기";
} else {
this.slideText = "창닫기";
}
this.showSlide = !this.showSlide;
},
dongSelectF: function (event) {
},
//지역 및 조건 설정 안에 있는 횡단보도의 위치와 횟수의 합
changeTab(tabId) {
this.activeTab = tabId;
},
showPopup() {
this.isPopupVisible = true;
},
hidePopup(node_id) {
this.isPopupVisible = false;
},
// 팝업 상세
openDetailPopup(type) {
let vm = this;
vm.eventListSearch.currentPage = 1;
vm.eventListSearch.startDate = vm.condition.date + ' ' + vm.condition.start_time;
vm.eventListSearch.endDate = vm.condition.date + ' ' + vm.condition.end_time;
// 무단횡단
if (type == 'c1') {
vm.eventListSearch.eventType = '무단횡단';
// 신호연장
} else if (type == 'c2') {
vm.eventListSearch.eventType = '신호연장';
// 차량위반
} else if (type == 'c3') {
vm.eventListSearch.eventType = '우회전신호위반';
// 장비발생
} else if (type == 'c4') {
vm.eventListSearch.eventType = '장비장애';
}
if (type != 'c4') {
const vm = this;
axios({
url: "/statusControl/eventSelectList.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: vm.eventListSearch,
})
.then(function (response) {
vm.eventListCount = response.data.eventListCount;
vm.eventList = response.data.eventList;
vm.eventIdx = response.data.eventListCount - (vm.eventListSearch.currentPage - 1) * vm.eventListSearch.perPage;
vm.modal_event_detail_list = true;
})
.catch(function (error) {
alert("상황발생 목록 조회 오류, 관리자에게 문의해주세요.");
});
}
},
// 마우스 클릭
childClick: function (prop, coordinate, layerCk, map) {
var vm = this;
if (layerCk == true) {
if (prop[0] != null && prop[0].layerName != 'multiPolygonLayer') {
if (prop[0].layerName === 'dong') {
//this.address.dong_dong_cd = prop[0].id_;
//this.address.dong_cd =prop[0].id_;
vm.eventListSearch.dong_cd = prop[0].id_;
} else if (prop[0].layerName === 'node') {
//this.address.node_id = prop[0].id_;
vm.eventListSearch.node_id = prop[0].id_;
}
this.createPopup(coordinate, prop[0]);
}
}
},
// 장애 팝업
createErrorPopup: function (item) {
var vm = this;
vm.$refs.open_layers.map.removeOverlay(vm.$refs.open_layers.map.getOverlayById('multiPopup'));
let element = document.createElement("div");
element.classList.add('ol-popup');
// 검색창 떠있는 동안은 자동 리프레쉬 멈춤
var html = "";
html = "<div style='transform: translate(0%, 0%) translate(-150px,-230px);'>"
+ " <table class='map_multi_popup' >"
+ " <thead>"
+ " <td colspan='4' class='fon'> <span > " + item.node_name + "_" + item.crslk_az + "측 획단보도 장애정보 <a id='popup-closer' class='ol-popup-closer' style='float: right;'>X </a> </span></td>"
+ " </thead>"
+ " <tbody>"
+ " <tr>"
+ " <th colspan='3'>장애명</th>"
+ " <td >" + item.trobl_nm + "</td>"
+ " </tr>"
+ " <tr>"
+ " <th colspan='3'>담당자</th>"
+ " <td >" + item.mngr_nm + "</td>"
+ " </tr>"
+ " <tr>"
+ " <th colspan='3'>연락처</th>"
+ " <td >" + item.mngr_telno + "</td>"
+ " </tr>"
+ " <tr>"
+ " <th colspan='3'>이메일</th>"
+ " <td >" + item.mngr_eml + "</td>"
+ " </tr>"
+ " <tr>"
+ " <th colspan='3'>소속정보</th>"
+ " <td >" + item.mngr_ogdp_info + "</td>"
+ " </tr>"
+ "<tr>"
+ " <th colspan='5'><button class='map_multi_popup_move_button' id='close'>닫기</button></th>"
+ " </tr>"
+ " </tbody>"
+ " </table>"
+ " </div>";
+ " </tbody>"
+ " </table>"
+ " </div>";
element.innerHTML = html;
element.style.display = 'block';
// OverLay 생성
let overlay = new Overlay({
id: 'multiPopup',
element: element, // 생성한 DIV
autoPan: true,
className: "multiPopup",
autoPanMargin: 100,
autoPanAnimation: {
duration: 400
}
});
//오버레이의 위치 저장
var geom = JSON.parse(item.geom.value);
// console.log(geom);
overlay.setPosition(geom.coordinates);
//지도에 추가
this.$refs.open_layers.map.addOverlay(overlay);
// 해당 DIV 다켓방법
let oElem = overlay.getElement();
oElem.addEventListener('click', function (e) {
var target = e.target;
if (target.className == "ol-popup-closer" || target.className == 'map_multi_popup_move_button') {
//선택한 OverLayer 삭제
vm.$refs.open_layers.map.removeOverlay(vm.$refs.open_layers.map.getOverlayById('multiPopup'));
vm.timer = setInterval(() => {
vm.statusSearch(false);
}, 5000)
}
});
},
// 정보 팝업
createPopup: function (coordinate, prop) {
var vm = this;
vm.$refs.open_layers.map.removeOverlay(vm.$refs.open_layers.map.getOverlayById('multiPopup'));
let element = document.createElement("div");
element.classList.add('ol-popup');
// 검색창 떠있는 동안은 자동 리프레쉬 멈춤
clearInterval(this.timer);
var html = "";
html = "<div style='transform: translate(0%, 0%) translate(-150px,-190px);'>"
+ " <table class='map_multi_popup' >"
+ " <thead>"
+ " <td colspan='5' class='fon'> <span > " + prop.values_.name + " <a id='popup-closer' class='ol-popup-closer' style='float: right;'>X </a> </span></td>"
+ " </thead>"
+ " <tbody>"
+ " <tr>"
+ " <th colspan='3'>무단횡단 발생</th>"
+ " <td >" + prop.values_.crosng_cnt + "</td>"
+ " <td ><button class='map_multi_popup_button' id='c1' >상세</button></td>"
+ " </tr>"
+ " <tr>"
+ " <th colspan='3'>신호연장 발생</th>"
+ " <td >" + prop.values_.extn_cnt + "</td>"
+ " <td ><button class='map_multi_popup_button' id='c2' >상세</button></td>"
+ " </tr>"
+ " <tr>"
+ " <th colspan='3'>차량위반 발생</th>"
+ " <td >" + prop.values_.law_vltn_cnt + "</td>"
+ " <td ><button class='map_multi_popup_button' id='c3' >상세</button></td>"
+ " </tr>"
+ " <tr>"
+ " <th colspan='3'>장비장애 발생</th>"
+ " <td >" + prop.values_.error_cnt + "</td>"
+ " <td ><button class='map_multi_popup_button' id='c1' >상세</button></td>"
+ " </tr>";
if (prop.layerName != 'crslk') {
html += "<tr>"
+ " <th colspan='5'><button class='map_multi_popup_move_button' id='move'>이동</button></th>"
+ " </tr>"
+ " </tbody>"
+ " </table>"
+ " </div>";
} else {
html += " </tbody>"
+ " </table>"
+ " </div>";
}
element.innerHTML = html;
element.style.display = 'block';
// OverLay 생성
let overlay = new Overlay({
id: 'multiPopup',
element: element, // 생성한 DIV
autoPan: true,
className: "multiPopup",
autoPanMargin: 100,
autoPanAnimation: {
duration: 400
}
});
//오버레이의 위치 저장
overlay.setPosition(prop.values_.geometry.flatCoordinates);
//지도에 추가
this.$refs.open_layers.map.addOverlay(overlay);
// 해당 DIV 다켓방법
let oElem = overlay.getElement();
oElem.addEventListener('click', function (e) {
var target = e.target;
if (target.className == "ol-popup-closer") {
//선택한 OverLayer 삭제
vm.$refs.open_layers.map.removeOverlay(vm.$refs.open_layers.map.getOverlayById('multiPopup'));
element = '';
vm.timer = setInterval(() => {
vm.statusSearch(false);
}, 5000)
} else if (target.className == "map_multi_popup_button") {
vm.openDetailPopup(target.id)
} else if (target.className == "map_multi_popup_move_button") {
if (prop != null && prop.layerName != 'multiPolygonLayer') {
if (prop.layerName === 'dong') {
vm.address.dong_dong_cd = prop.id_;
vm.address.dong_cd = prop.id_;
} else if (prop.layerName === 'node') {
vm.address.node_id = prop.id_;
}
vm.statusSearch(true);
}
vm.timer = setInterval(() => {
vm.statusSearch(false);
}, 5000)
}
});
},
// 장애 발생 현황 클릭
troblCcrnLocation: function (item) {
// console.log('troblCcrnLocation', item);
clearInterval(this.timer);
this.address.node_id = item.node_id;
this.statusSearch(true);
this.eventFlage = true;
this.createErrorPopup(item);
},
// 셀렉트 선택시 반영 데이터
getStatusData: function (pointAnim) {
const vm = this;
var layer = 'dong'
var epsg = "EPSG:5181";
if (vm.address.guGun_dong_cd == null) {
layer = 'sigungu';
} else if (vm.address.node_id != null) {
layer = 'crslk';
} else if (vm.address.dong_dong_cd != null) {
layer = 'node';
epsg = "EPSG:4326";
}
axios({
url: "/common/getStatusDataGeoJson.json",
method: 'post',
headers: {
'Content-Type': 'application/json; charset=UTF-8'
},
data: {
"dong_cd": vm.address.dong_cd
, "start_dt": vm.condition.date + ' ' + vm.condition.start_time
, "end_dt": vm.condition.date + ' ' + vm.condition.end_time
, "layer": layer
, "signExtn": vm.condition.signExtn
, "wtrms": vm.condition.wtrms
, "rittrnVhcle": vm.condition.rittrnVhcle
, "eqpmnTrobl": vm.condition.eqpmnTrobl
, "currentTimestamp": vm.condition.currentTimestamp
},
}).then(function (response) {
vm.statusControlCountList = response.data.totalCount;
vm.$refs.open_layers.removeAddLayerAll();
vm.$refs.open_layers.addLayerByGeojson(response.data.geojson, layer, epsg, baseStyles["labelStyle"], "label");
// 마지막 시간 데이터 생성
vm.condition.currentTimestamp = response.data.realTimeEvent.currentTimestamp;
// 이벤트 리스트 등록
vm.realTimeEventList = response.data.realTimeEvent.RealTimeEventList;
// console.log( ' vm.realTimeEventList',vm.realTimeEventList)
// 실시간 이벤트 발생여부 체크
if (vm.realTimeEventList.length > 0) {
vm.popupStatus = Object.assign({}, vm.realTimeEventList[0]);
vm.address.node_id = vm.popupStatus.node_id;
vm.statusSearch(true);
vm.eventFlage = true;
vm.showPopup();
}
// 차트 데이터 생성
vm.drawChars(response.data.countList);
}).catch(function (error) {
console.log("error : ", error);
}).finally(function () {
// 항상 실행되는 영역
if (vm.address.guGun_dong_cd == null) {
layer = 'sigungu';
vm.$refs.open_layers.addVectorLayerByUrl("/common/getDongsGeoJson.json", "multiPolygonLayer", "EPSG:5181", baseStyles["MultiPolygon"], "MultiPolygon", pointAnim, vm.address.dong_cd);
} else if (vm.address.node_id != null) {
layer = 'crslk';
// epsg = "EPSG:4326";
vm.$refs.open_layers.addVectorLayerByUrl("/common/getNodeGeoJson.json", "multiPolygonLayer", "EPSG:4326", baseStyles["MultiPolygon"], "MultiPolygon", pointAnim, vm.address.dong_cd, vm.address.node_id);
} else if (vm.address.dong_dong_cd != null) {
layer = 'node';
epsg = "EPSG:4326";
vm.$refs.open_layers.addVectorLayerByUrl("/common/getDongGeoJson.json", "multiPolygonLayer", "EPSG:5181", baseStyles["MultiPolygon"], "MultiPolygon", pointAnim, vm.address.dong_cd);
} else {
vm.$refs.open_layers.addVectorLayerByUrl("/common/getDongsGeoJson.json", "multiPolygonLayer", "EPSG:5181", baseStyles["MultiPolygon"], "MultiPolygon", pointAnim, vm.address.dong_cd);
}
});;
},
// 서치 버튼 클릭
statusSearch: function (pointAnim) {
var vm = this;
// 검색 버튼 클릭
if (pointAnim == true) {
if (this.$refs.open_layers.map.getOverlayById('multiPopup') != null) {
this.$refs.open_layers.map.removeOverlay(this.$refs.open_layers.map.getOverlayById('multiPopup'));
vm.timer = setInterval(() => {
vm.statusSearch(false);
}, 5000)
}
// 자동 처리
} else {
if (this.$refs.open_layers.map.getOverlayById('multiPopup') != null) {
return false;
}
}
// 이벤트 발생시 다시 제자리로
if (this.eventFlage == true) {
this.isPopupVisible = false;
this.eventFlage = false;
this.address.node_id = null;
pointAnim = true;
}
if (pointAnim == null) {
pointAnim = true;
}
//지도 영역 수정
this.getStatusData(pointAnim);
this.situationOccurrenceStatusSearch();
this.troubleOccurrenceStatusSearch();
},
// 차트 그리기
drawChars: function (data) {
// 횡단보도별 무단횡단 차트 정보
var wtrmsCount = data.sort(function (a, b) {
return b.wtrmsCount - a.wtrmsCount;
});
wtrmsCount = wtrmsCount.slice(0, 10);
// 신호연장 차트 정보
var signExtnCount = data.sort(function (a, b) {
return b.signExtnCount - a.signExtnCount;
});
signExtnCount = signExtnCount.slice(0, 10);
// 우회전 위반 차트 정보
var rittrnVioltVhcleCount = data.sort(function (a, b) {
return b.rittrnVioltVhcleCount - a.rittrnVioltVhcleCount;
});
rittrnVioltVhcleCount = rittrnVioltVhcleCount.slice(0, 5);
// 장애발생 차트 정보
var troblOcrnCount = data.sort(function (a, b) {
return b.troblOcrnCount - a.troblOcrnCount;
});
troblOcrnCount = troblOcrnCount.slice(0, 5);
// 차트 생성
if (this.chart1.xAxis == null) {
this.chart1 = COMMON_CHART.createChartByIds("chartdiv1", this.chart1, wtrmsCount, "wtrmsCount", "crslk_nm");
this.chart2 = COMMON_CHART.createChartByIds("chartdiv2", this.chart2, signExtnCount, "signExtnCount", "crslk_nm");
this.chart3 = COMMON_CHART.createChartByIds("chartdiv3", this.chart3, rittrnVioltVhcleCount, "rittrnVioltVhcleCount", "crslk_nm");
this.chart4 = COMMON_CHART.createChartByIds("chartdiv4", this.chart4, troblOcrnCount, "troblOcrnCount", "crslk_nm");
} else {
// 데이터 변경
this.chart1.xAxis.data.setAll(wtrmsCount);
this.chart1.series.data.setAll(wtrmsCount);
this.chart2.xAxis.data.setAll(signExtnCount);
this.chart2.series.data.setAll(signExtnCount);
this.chart3.xAxis.data.setAll(rittrnVioltVhcleCount);
this.chart3.series.data.setAll(rittrnVioltVhcleCount);
this.chart4.xAxis.data.setAll(troblOcrnCount);
this.chart4.series.data.setAll(troblOcrnCount);
}
},
//상황 발행 현황 검색
statusControlCount: function () {
//검색 데이터
const vm = this;
axios({
url: "/statusControl/statusControlCount.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: { "dong_cd": vm.address.dong_cd, "start_dt": vm.condition.date + ' ' + vm.condition.start_time, "end_dt": vm.condition.date + ' ' + vm.condition.end_time, "layer": layer },
// data: vm.address ,
})
.then(function (response) {
vm.statusControlCountList = response.data;
})
.catch(function (error) {
});
},
//상황 발행 현황 검색
eventSelectByRegion: function () {
//검색 데이터
const vm = this;
axios({
url: "/statusControl/eventSelectByRegion.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: vm.address,
})
.then(function (response) {
vm.chartData.wtrms = response.data.wtrms;
vm.chartData.signExtn = response.data.signExtn;
vm.chartData.rittrnVioltVhcle = response.data.rittrnVioltVhcle;
vm.chartData.troblOcrn = response.data.troblOcrn;
})
.catch(function (error) {
console.log("eventSelectByRegion - error : ", error);
});
},
//실시간 발생 현황 - 상황 발행 현황 검색
situationOccurrenceStatusSearch: function () {
//검색 데이터
const vm = this;
vm.situationOccurrenceStatusListSearch.condition = vm.condition;
vm.situationOccurrenceStatusListSearch.address = vm.address;
axios({
url: "/statusControl/situationOccurrenceStatusSearch.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: vm.situationOccurrenceStatusListSearch,
})
.then(function (response) {
vm.situationOccurrenceStatusList = response.data.situationOccurrenceStatusList;
vm.situationOccurrenceStatusListCount = response.data.situationOccurrenceStatusListCount;
})
.catch(function (error) {
console.log("statusSearch - error : ", error);
});
},
//실시간 발생 현황 - 장애발생현황
troubleOccurrenceStatusSearch: function () {
//검색 데이터
const vm = this;
axios({
url: "/statusControl/troubleOccurrenceStatusSearch.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: vm.troubleOccurrenceStatusListSearch,
})
.then(function (response) {
vm.troubleOccurrenceStatusList = response.data.troubleOccurrenceStatusList;
vm.troubleOccurrenceStatusListCount = response.data.troubleOccurrenceStatusListCount;
})
.catch(function (error) {
console.log("statusSearch - error : ", error);
});
},
// 이벤트 발생 상세정보 조회(클릭 이벤트)
eventSelectList: function () {
const vm = this;
axios({
url: "/statusControl/eventSelectList.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: vm.eventListSearch,
})
.then(function (response) {
vm.eventListCount = response.data.eventListCount;
vm.eventList = response.data.eventList;
vm.eventIdx = response.data.eventListCount - (vm.eventListSearch.currentPage - 1) * vm.eventListSearch.perPage;
})
.catch(function (error) {
console.log("errorSelectList - error : ", error);
alert("상황발생 목록 조회 오류, 관리자에게 문의해주세요.");
});
},
// 날짜 초기화
initialDate() {
this.condition.date = COMMON_UTIL.today();
this.condition.start_time = "00:00";
this.condition.end_time = "23:59";
this.eventListSearch.sigungu_cd = this.address.guGun_dong_cd;
this.eventListSearch.dong_cd = this.address.dong_cd;
this.eventListSearch.dong_dong_cd = this.address.node_id;
this.eventListSearch.node_id = this.address.node_id;
},
init() {
this.statusControlCount();
this.eventSelectByRegion();
const clusterLayerExists = this.$refs.open_layers.map.getLayers().getArray().some(layer => {
return layer.get('name') === "clusterLayer";
});
if (clusterLayerExists) {
this.$refs.open_layers.addClusterLayerByUrl("/common/getNodeGeoJsonForWtrmsCrosngStatusControl.json", "clusterLayer", "EPSG:5181", baseStyles["clusterStyle"], "clusterStyle", this.address.dong_cd);
}
this.$refs.open_layers.addVectorLayerByUrl('/common/getCrslksGeoJson.json', 'crslkLayer', 'EPSG:5181', baseStyles['labelStyle'], 'label', this.address.dong_cd, this.address.node_id);
this.situationOccurrenceStatusSearch();
this.troubleOccurrenceStatusSearch();
},
},
watch: {
"condition.date": function (newValue, oldValue) {
},
"condition.start_time": function (newValue, oldValue) {
},
"condition.end_time": function (newValue, oldValue) {
},
"now_zoom": function (newValue, oldValue) {
},
"chartData.wtrms": function (newValue, oldValue) {
COMMON_CHART.createChartById("chartdiv1", this.chart1, newValue);
},
"chartData.signExtn": function (newValue, oldValue) {
COMMON_CHART.createChartById("chartdiv2", this.chart2, newValue);
},
"chartData.rittrnVioltVhcle": function (newValue, oldValue) {
COMMON_CHART.createChartById("chartdiv3", this.chart3, newValue);
},
"chartData.troblOcrn": function (newValue, oldValue) {
COMMON_CHART.createChartById("chartdiv4", this.chart4, newValue);
},
},
computed: {},
computed: {
comma() {
return (v) => {
return v.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};
},
},
mounted() {
var vm = this;
this.initialDate();
this.$refs.open_layers.setBaseMap(vworldBaseLayer);
this.$refs.dongSelecter.default_select(false, true, '22', '22030');
this.statusSearch();
this.timer = setInterval(() => {
this.statusSearch(false);
}, 5000)
},
};
</script>
<style scoped>
@media all and (max-width: 479px) {
.top h3 {
font-size: 15px !important;
}
.top p {
padding-right: 1rem;
}
.chart {
width: -webkit-fill-available !important;
}
.top {
overflow: scroll;
}
.top ul {
width: 137rem;
overflow: hidden;
justify-content: space-between !important;
padding: 2rem 1rem !important;
}
.top li {
display: flex;
align-items: center;
}
.search {
width: inherit;
}
/*
.toggle {
color: #fff;
font-weight: bold;
background: #13833b;
display: block !important;
position: absolute;
z-index: 150;
top: 7.2rem;
right: 1rem;
} */
.wrap {
height: auto !important;
width: inherit;
margin: 0 !important;
}
.slide-content {
position: absolute;
z-index: 97;
top: 6rem;
/* left: -31rem; */
width: -webkit-fill-available;
height: 100vh;
background-color: #f0f0f0;
transition: transform 0.3s ease;
transform: translateX(100%);
}
.slide-content.active {
transform: translateX(0);
}
}
.search label {
line-height: 3rem;
}
.tab-buttons .ulbox {
height: calc(100% - 11rem);
overflow: scroll;
overflow-x: hidden;
}
.ulbox ul {
height: 30rem;
}
.ulbox ul li p {
font-size: 13px;
}
.popup-btn {
position: absolute;
bottom: 3rem;
right: 28%;
}
.popup-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
/* background-color: rgba(0, 0, 0, 0.7); */
z-index: 9999;
}
.popup-content {
background-color: #000000a3;
width: 17%;
text-align: center;
color: #ffffff;
/* height: 20%; */
padding: 20px;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
}
.popup-content ul {
padding: 2rem 0;
}
.popup-content ul li {
font-size: 16px;
}
.popup-content h2 {
margin-top: 0;
font-size: 2.5rem;
color: #bf1a21;
}
.toggle {
display: none;
}
.chart>div {
height: 100%;
}
.chart .box {
height: 85%;
}
.chart {
width: 20%;
height: 85%;
position: absolute;
right: 2rem;
top: 10rem;
}
.chart h2 {
border-radius: 10px 10px 0 0;
}
.search .box ul li {
text-align: left;
}
.search .box button {
font-size: 1.3rem;
padding: 0.5rem 1.3rem;
}
.search .box button.gray-btn.active {
/* Your CSS styles for the button when it's active (clicked) */
background-color: #13833b;
color: #fff;
/* Add any other styles you want to apply when the button is active */
}
.search .box button img {
width: 20px;
}
.btn_set {
position: relative;
border-bottom: 1px solid #e5e3e3;
padding: 0 0 1rem 0;
}
.btn_set div {
position: absolute;
top: 40px;
width: 313px;
height: 380px;
background: #fff;
padding: 1rem;
}
.bg-white::-webkit-scrollbar-thumb {
background-color: #fff;
}
.left h2,
.chart h2 {
background: #50ba8a;
text-align: center;
color: #fff;
padding: 1.6rem 0;
}
.left h2 {
padding: 1rem 0;
font-size: 1.3rem;
}
.top {
z-index: 100;
background: #fdfdf2;
top: 0;
/* width: -webkit-fill-available; */
height: 86px !important;
}
.top p {
font-size: 15px;
}
.top ul {
height: inherit;
justify-content: space-evenly;
}
.top li {
text-align: center;
}
.top li img {
width: 20px;
}
.top h3 {
font-size: 20px;
text-align: end;
}
.wrap {
z-index: 100;
top: 0;
height: inherit;
}
.left {
background: #fff;
height: 100%;
}
.right {
width: -webkit-fill-available;
position: relative;
height: 100%;
}
.map {
width: 100%;
height: calc(100% - 86px);
}
</style>